package controlador;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import datos.AccionesCategoria;
import datos.AccionesCompra;
import datos.AccionesDetalleCompra;
import datos.AccionesDetalleVenta;
import datos.AccionesLinea;
import datos.AccionesMarca;
import datos.AccionesProducto;
import datos.AccionesProveedor;
import datos.AccionesUsuario;
import datos.AccionesValorFecha;
import datos.AccionesVenta;
import datos.Categoria;
import datos.Compra;
import datos.DetalleCompra;
import datos.DetalleVenta;
import datos.Linea;
import datos.Producto;
import datos.Proveedor;
import datos.Usuario;
import datos.ValorFecha;
import datos.Venta;

/**
 * Servlet implementation class RegistrarCompra
 */
public class RegistrarCompra extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegistrarCompra() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession sesion=request.getSession();
		String user=(String)sesion.getAttribute("user");
		String pass=(String)sesion.getAttribute("pass");
		Usuario u=new Usuario(user, pass);
		String r=AccionesUsuario.reemplazar(this.getClass().getSimpleName());
		if(AccionesUsuario.validarUsuario(u)){
			if(AccionesUsuario.validarPermiso(u, r)){
			String idProducto=request.getParameter("idProducto");//obtengo el idProducto del formulario
			String idComparar=null;
			ArrayList<Producto> productos=(ArrayList<Producto>)sesion.getAttribute("listaProductosCompra");//obtengo la lista temporal de productos
			ArrayList<Producto> prodNuevos=(ArrayList<Producto>)sesion.getAttribute("prodNuevos");
			for(int i=0; i<productos.size(); i++){//recorro la lista
				idComparar=productos.get(i).getIdProducto();//inicializo la variable con el idProducto del producto del indice en el que estoy parado
				if(idProducto.equals(idComparar)){//comparo los dos idProducto
					productos.remove(i);//cuando coincida elimino el producto de la lista temporal
				}
			}
			if(!prodNuevos.isEmpty()){
				for(int i=0; i<prodNuevos.size(); i++){//recorro la lista
					idComparar=prodNuevos.get(i).getIdProducto();//inicializo la variable con el idProducto del producto del indice en el que estoy parado
					if(idProducto.equals(idComparar)){//comparo los dos idProducto
						prodNuevos.remove(i);//cuando coincida elimino el producto de la lista temporal
					}
				}
			}
			sesion.setAttribute("prodNuevos", prodNuevos);
			sesion.setAttribute("listaProductos", productos);//guardo nuevamente la lista de productos en sesion
			response.sendRedirect("agregarProductosCompra.jsp");
		}else{
			response.sendRedirect("index.jsp");
		}
		}else{
			response.sendRedirect("login.jsp");
		}
}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession sesion=request.getSession();
		String user=(String)sesion.getAttribute("user");
		String pass=(String)sesion.getAttribute("pass");
		Usuario u=new Usuario(user, pass);
		String r=AccionesUsuario.reemplazar(this.getClass().getSimpleName());
		if(AccionesUsuario.validarUsuario(u)){
			if(AccionesUsuario.validarPermiso(u, r)){
			String submit=request.getParameter("submit");
			
			switch(submit){
			case "Agregar Productos":
				String idCompraStr=request.getParameter("idCompra");
				if(idCompraStr==null){
					int idTipoCompra=Integer.parseInt(request.getParameter("idTipoCompra"));//obtengo el idTipoCompra del form
					int maxIdCompra=AccionesCompra.getMaxNumFactura(idTipoCompra);//obtengo el ultimo idCompra para ese tipo de compra
					int idProveedor=Integer.parseInt(request.getParameter("idProveedor"));//obtengo idProveedor
					//int idTipoPago=Integer.parseInt(request.getParameter("idTipoPago"));
					int idCompra=maxIdCompra+1;//genero el nuevo idCompra para la compra actual
					double flete=0;//inicializo variables
					double descuentoCompra=0;
					double recargoCompra=0;
					if(request.getParameter("descuentoCompra")!=null && request.getParameter("descuentoCompra")!=""){//valido que las variable no venga vacia
						descuentoCompra=Double.parseDouble(request.getParameter("descuentoCompra"));//en caso de no venir vacia la parseo
					}
					if(request.getParameter("recargoCompra")!=null && request.getParameter("recargoCompra")!=""){//valido que las variable no venga vacia
						recargoCompra=Double.parseDouble(request.getParameter("recargoCompra"));//en caso de no venir vacia la parseo
					}
					if(request.getParameter("flete")!=null && request.getParameter("flete")!=""){//valido que las variable no venga vacia
						flete=Double.parseDouble(request.getParameter("flete"));//en caso de no venir vacia la parseo
					}
					
					sesion.setAttribute("idCompra", idCompra);//guardo todas las variables en sesion
					sesion.setAttribute("idProveedor", idProveedor);
					sesion.setAttribute("idTipoCompra", idTipoCompra);
					sesion.setAttribute("fleteCompra", flete);
					sesion.setAttribute("descuentoCompra", descuentoCompra);
					sesion.setAttribute("recargoCompra", recargoCompra);
					//sesion.setAttribute("idTipoPago", idTipoPago);
					//System.out.println("idTipoPago: "+idTipoPago);
					ArrayList<Producto> productos=new ArrayList<Producto>();//creo array de productos vacio y lo guardo en sesion
					ArrayList<Producto> prodNuevos=new ArrayList<Producto>();
					sesion.setAttribute("prodNuevos", prodNuevos);
					sesion.setAttribute("listaProductosCompra",productos);
					sesion.setAttribute("errorIdCompraExiste", false);
					response.sendRedirect("agregarProductosCompra.jsp");
				}else{
					int idCompra=Integer.parseInt(idCompraStr);
					int idTipoCompra=Integer.parseInt(request.getParameter("idTipoCompra"));
					if(AccionesCompra.getOne(idCompra, idTipoCompra)==null){
					
					int idProveedor=Integer.parseInt(request.getParameter("idProveedor"));
					double flete=0;//inicializo variables
					double descuentoCompra=0;
					double recargoCompra=0;
					if(request.getParameter("descuentoCompra")!=null && request.getParameter("descuentoCompra")!=""){//valido que las variable no venga vacia
						descuentoCompra=Double.parseDouble(request.getParameter("descuentoCompra"));//en caso de no venir vacia la parseo
					}
					if(request.getParameter("recargoCompra")!=null && request.getParameter("recargoCompra")!=""){//valido que las variable no venga vacia
						recargoCompra=Double.parseDouble(request.getParameter("recargoCompra"));//en caso de no venir vacia la parseo
					}
					if(request.getParameter("flete")!=null && request.getParameter("flete")!=""){//valido que las variable no venga vacia
						flete=Double.parseDouble(request.getParameter("flete"));//en caso de no venir vacia la parseo
					}
					
					sesion.setAttribute("idCompra", idCompra);//guardo todas las variables en sesion
					sesion.setAttribute("idProveedor", idProveedor);
					sesion.setAttribute("idTipoCompra", idTipoCompra);
					sesion.setAttribute("fleteCompra", flete);
					sesion.setAttribute("descuentoCompra", descuentoCompra);
					sesion.setAttribute("recargoCompra", recargoCompra);
					//sesion.setAttribute("idTipoPago", idTipoPago);
					//System.out.println("idTipoPago: "+idTipoPago);
					ArrayList<Producto> productos=new ArrayList<Producto>();//creo array de productos vacio y lo guardo en sesion
					ArrayList<Producto> prodNuevos=new ArrayList<Producto>();
					sesion.setAttribute("prodNuevos", prodNuevos);
					sesion.setAttribute("listaProductosCompra",productos);
					sesion.setAttribute("errorIdCompraExiste", false);
					response.sendRedirect("agregarProductosCompra.jsp");
					}else{
						sesion.setAttribute("errorIdCompraExiste", true);
						response.sendRedirect("registrarCompra.jsp");
					}
				}
				//redireccion al jsp para agregar productos a la compra
				break;
			case "Agregar":
				String idProducto=request.getParameter("idProducto");//obtengo variables del form
				int cantidad=Integer.parseInt(request.getParameter("cantidad"));
				double nuevoCosto=Double.parseDouble(request.getParameter("costo"));
				double nuevoPrecio=Double.parseDouble(request.getParameter("precio"));
				ArrayList<Producto> listaProductos=(ArrayList<Producto>)sesion.getAttribute("listaProductosCompra");//obtengo la lista de productos temporal
				String desc=AccionesProducto.getOneById(idProducto).getNombre();
				Producto p=new Producto(idProducto, desc, null, null, null, nuevoCosto, nuevoPrecio, cantidad, 0, null);//creo un nuevo producto con las variables obtenidas
				if(!listaProductos.isEmpty()){
					boolean existeId=false;
					int posicion=0;
					Producto pArray=null;
					for(int i=0; i<listaProductos.size(); i++){
						if(listaProductos.get(i).getIdProducto().equals(p.getIdProducto())){
							existeId=true;
							posicion=i;
						}
					}
					if(existeId==true){
						pArray=listaProductos.get(posicion);
						pArray.setCantidad(pArray.getCantidad()+p.getCantidad());
						
						double sumaPreciosEx=(pArray.getPrecio()*(pArray.getCantidad()-p.getCantidad()));
						double sumaPreciosNu=(p.getPrecio()*p.getCantidad());
						double cantidadTotalPrecios=(pArray.getCantidad());
						double precioFinalCalculadoPrecios=(sumaPreciosEx+sumaPreciosNu)/cantidadTotalPrecios;
						//System.out.println("sumaPreciosEx "+sumaPreciosEx);
						//System.out.println("sumaPreciosNu "+sumaPreciosNu);
						//System.out.println("cantidadTotal "+cantidadTotal);
						//System.out.println("precioFinal "+precioFinalCalculado);
						pArray.setPrecio(precioFinalCalculadoPrecios);
						double sumaCostosEx=(pArray.getCosto()*(pArray.getCantidad()-p.getCantidad()));
						double sumaCostosNu=(p.getCosto()*p.getCantidad());
						double cantidadTotalCostos=(pArray.getCantidad());
						double precioFinalCalculadoCostos=(sumaCostosEx+sumaCostosNu)/cantidadTotalCostos;
						pArray.setCosto(precioFinalCalculadoCostos);
						for(int i=0; i<listaProductos.size(); i++){
							if(listaProductos.get(i).getIdProducto().equals(p.getIdProducto())){
								listaProductos.remove(i);
								listaProductos.add(pArray);
							}
						}
						sesion.setAttribute("listaProductosCompra", listaProductos);
						
						response.sendRedirect("agregarProductosCompra.jsp");
					}else{
						listaProductos.add(p);
						sesion.setAttribute("listaProductosCompra", listaProductos);
						
						response.sendRedirect("agregarProductosCompra.jsp");
					}
				}else{
					listaProductos.add(p);
					sesion.setAttribute("listaProductosCompra", listaProductos);
					
					response.sendRedirect("agregarProductosCompra.jsp");
				}
				//listaProductos.add(p);//lo guardo en la lista temporal
				//response.sendRedirect("agregarProductosCompra.jsp");//vuelvo a redireccionar al mismo jsp
				break;
			case "Finalizar Compra":
				
				
				ArrayList<Producto> prodNuevos2=(ArrayList<Producto>)sesion.getAttribute("prodNuevos");
				ArrayList<Producto> productos2=(ArrayList<Producto>)sesion.getAttribute("listaProductosCompra");//se obtiene la lista temporal de productos
				if(productos2.isEmpty()){
					//System.out.println("entro empty");
					sesion.setAttribute("errorRegistrarCompra", true);
					sesion.setAttribute("exitoFinalizarCompra", false);
					response.sendRedirect("agregarProductosCompra.jsp");
				}else{
					//System.out.println("no entro empty");
					int idCompra1=(Integer)sesion.getAttribute("idCompra");//obtengo todos los parametros generales de la compra que estaban guardados en sesion
					int idTipoCompra1=(Integer)sesion.getAttribute("idTipoCompra");
					//int idTipoPago1=(Integer)sesion.getAttribute("idTipoPago");
					int idProveedor1=(Integer)sesion.getAttribute("idProveedor");
					double total=(Double)sesion.getAttribute("totalCompra");
					double flete1=0;
					if(sesion.getAttribute("fleteCompra")!=null && sesion.getAttribute("fleteCompra")!=""){
						flete1=(Double)sesion.getAttribute("fleteCompra");
					}
					double descuentoCompra1=(Double)sesion.getAttribute("descuentoCompra");
					double recargoCompra1=(Double)sesion.getAttribute("recargoCompra");
					Compra c=new Compra(idCompra1, null, idTipoCompra1,flete1, total, idProveedor1, descuentoCompra1, recargoCompra1);//creo una nueva compra con todos los parametros anteriores
					AccionesCompra.addCompra(c);//agrego la compra a la DB
					String idProductoNuevo=null;
					String idComparar=null;
				if(!prodNuevos2.isEmpty()){//si existe un nuevo producto
					for(int i=0; i<prodNuevos2.size(); i++){
						Producto proNuevo=prodNuevos2.get(i);//lo obtengo de una variable de sesion
						idProductoNuevo=proNuevo.getIdProducto();//obtengo el id del nuevo producto
						AccionesProducto.addProducto(proNuevo);//agrego el nuevo producto a la DB
						DetalleCompra dc1=new DetalleCompra(idCompra1,proNuevo,proNuevo.getCantidad(),(proNuevo.getCosto()*proNuevo.getCantidad()));//agrego el detalleCompra correspondiente al nuevo Producto
						dc1.setIdTipoCompra((Integer)sesion.getAttribute("idTipoCompra"));//seteo tipo de compra al detalleCompra
						AccionesDetalleCompra.addDetalleCompra(dc1);//agrego el detalleCompra a la DB
						sesion.setAttribute("productoNuevo", null);//seteo la variable de sesion de producto nuevo en null
						sesion.setAttribute("productoNuevo1", null);
						ArrayList<Producto> productos3=(ArrayList<Producto>)sesion.getAttribute("listaProductosCompra");//obtengo la lista de productos temporal
						for(int j=0; j<productos3.size(); j++){//la recorro
							idComparar=productos3.get(j).getIdProducto();//elimino el producto nuevo recientemente agregado a la DB de la lista temporal
							if(idProductoNuevo.equals(idComparar)){//esto se hace para que luego, al agregar todos los productos ya esxistentes en la DB, no se intente agregar nuevamente el productoNuevo
								productos3.remove(j);
							}
						}
						sesion.setAttribute("listaProductosCompra", productos3);
					}
					
					
				}
				//en caso de no existir ningun producto nuevo se procede de la siguiente manera
				
				if(!productos2.isEmpty()){
				for(int i=0; i<productos2.size(); i++){//se la recorre
					if(AccionesProducto.costoEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getCosto())==false && AccionesProducto.precioEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getPrecio())==true){//chequeo si hubo cambio de costo
						ValorFecha vf=new ValorFecha(productos2.get(i).getIdProducto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getCosto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getPrecio());//en caso de haberlo se crea un objeto ValorFecha con los valores anteriores y nuevo de costo y precio
						vf.setCostoNuevo(productos2.get(i).getCosto());
						vf.setPrecioNuevo(productos2.get(i).getPrecio());
						AccionesValorFecha.addValorFecha(vf);//se asienta el cambio en la DB
					}else if(AccionesProducto.precioEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getPrecio())==false && AccionesProducto.costoEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getCosto())==true){//chequeo si hubo cambio de precio
						ValorFecha vf=new ValorFecha(productos2.get(i).getIdProducto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getCosto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getPrecio());//en caso de haberlo se crea un objeto ValorFecha con los valores anteriores y nuevo de costo y precio
						vf.setPrecioNuevo(productos2.get(i).getPrecio());
						vf.setCostoNuevo(productos2.get(i).getCosto());
						AccionesValorFecha.addValorFecha(vf);//se asienta el cambio en la DB
					}else if(AccionesProducto.costoEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getCosto())==false && AccionesProducto.precioEsIgual(productos2.get(i).getIdProducto(), productos2.get(i).getPrecio())==false){//chequeo si hubo cambio de ambos, precio y costo
						ValorFecha vf=new ValorFecha(productos2.get(i).getIdProducto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getCosto(), AccionesProducto.getOneById(productos2.get(i).getIdProducto()).getPrecio());//en caso de haberlo se crea un objeto ValorFecha con los valores anteriores y nuevo de costo y precio
						vf.setCostoNuevo(productos2.get(i).getCosto());
						vf.setPrecioNuevo(productos2.get(i).getPrecio());
						AccionesValorFecha.addValorFecha(vf);//se asienta el cambio en la DB
					}
				
					double subtotal=((productos2.get(i).getCosto())*(productos2.get(i).getCantidad()));//seteo el subtotal de la compra
					DetalleCompra dc=new DetalleCompra(idCompra1, productos2.get(i), productos2.get(i).getCantidad(),subtotal);//creo el detalleCompra para cada producto del array
					dc.setIdTipoCompra((Integer)sesion.getAttribute("idTipoCompra"));
					AccionesDetalleCompra.addDetalleCompra(dc);//agrego el detalleCompra para cada producto del array
					AccionesProducto.updateProductoCompra(productos2.get(i));//aumento la cantidad del producto comprado en la DB
				}
				sesion.setAttribute("exitoFinalizarCompra", true);
				sesion.setAttribute("errorRegistrarCompra", false);
				response.sendRedirect("compras.jsp");
				}else{
					sesion.setAttribute("errorRegistrarCompra", false);
					sesion.setAttribute("exitoFinalizarCompra", true);
					response.sendRedirect("compras.jsp");
				}
				}
				break;
			case "Agregar Nuevo":
				int idLinea=Integer.parseInt(request.getParameter("idLinea"));
				Categoria cat=AccionesCategoria.getCategoriaByLinea(idLinea);
				Linea lin=AccionesLinea.getLineaById(idLinea);
				lin.setIdLinea(idLinea);
				String nombreCat=cat.getNombre();
				String nombreLin=lin.getNombre();
				String cat3=nombreCat.substring(0,3);//obtengo las primeras 3 letras de la categoria
				String lin3=nombreLin.substring(0,3);//obtengo las primeras 3 letras de la linea
				String cod=cat3.concat(lin3);//concateno las letras antes obtenidas
				if(AccionesProducto.getUltimoIdProducto(cod)!=null && AccionesProducto.getUltimoIdProducto(cod)!=""){//si ya existe un idProducto de la misma familia
				String ultimoCod=AccionesProducto.getUltimoIdProducto(cod);//obtengo el ultimo indice para la familia del idProducto del formulario
				int ultimoIndice=Integer.parseInt(ultimoCod);//parseo el indice obtenido como String
				int indiceFinal=ultimoIndice+1;//le sumo uno al indice anterior para obtener el indice del siguiente idProducto
				String idProductoFinal=cod+indiceFinal;//armo el idProducto nuevo con el conjunto de letras que obtuve del formulario+el indiceFinal
				//System.out.println(indiceUltimo);
				//System.out.println(indiceFinal);
				//System.out.println(idProductoFinal);
				String nombre=request.getParameter("nombreProducto");
				int cantidadProducto=Integer.parseInt(request.getParameter("cantidad"));
				double costoProducto=Double.parseDouble(request.getParameter("costo"));
				double precioProducto=Double.parseDouble(request.getParameter("precio"));
				int idMarca=Integer.parseInt(request.getParameter("idMarca"));
				String idAlt="";
				if(request.getParameter("idAlt")!=null && request.getParameter("idAlt")!=""){
					idAlt=request.getParameter("idAlt");
				}
				int ptoCritico=Integer.parseInt(request.getParameter("ptoCritico"));
				Proveedor pro=AccionesProveedor.getOne((int)sesion.getAttribute("idProveedor"));
				Producto prod=new Producto(idProductoFinal, nombre, lin, AccionesMarca.getMarcaById(idMarca),pro, costoProducto, precioProducto, cantidadProducto, ptoCritico, idAlt);
				sesion.setAttribute("productoNuevo", prod);//seteo el producto en una variable de sesion para luego utilizarlo en el jsp para modificar atributos de este producto
				sesion.setAttribute("productoNuevo1", prod);
				response.sendRedirect("resumenNuevoProducto.jsp");
				}else{//si no existe ningun idProducto de la familia que se obtuvo del formulario
					String idProductoFinal=cod+1;//solamente se concatena el idProducto armado+1
					String nombre=request.getParameter("nombreProducto");
					int cantidadProducto=Integer.parseInt(request.getParameter("cantidad"));
					double costoProducto=Double.parseDouble(request.getParameter("costo"));
					double precioProducto=Double.parseDouble(request.getParameter("precio"));
					int idMarca=Integer.parseInt(request.getParameter("idMarca"));
					String idAlt="";
					if(request.getParameter("idAlt")!=null && request.getParameter("idAlt")!=""){
						idAlt=request.getParameter("idAlt");
					}
					int ptoCritico=Integer.parseInt(request.getParameter("ptoCritico"));
					Proveedor pro=AccionesProveedor.getOne((int)sesion.getAttribute("idProveedor"));
					Producto prod=new Producto(idProductoFinal, nombre, lin, AccionesMarca.getMarcaById(idMarca),pro, costoProducto, precioProducto, cantidadProducto, ptoCritico, idAlt);
					sesion.setAttribute("productoNuevo", prod);
					sesion.setAttribute("productoNuevo1", prod);
					response.sendRedirect("resumenNuevoProducto.jsp");
				}
				break;
			case "Finalizar":
				ArrayList<Producto> array=(ArrayList<Producto>)sesion.getAttribute("listaProductosCompra");//obtengo la lista temporal de productos
				ArrayList<Producto> prodNuevos1=(ArrayList<Producto>)sesion.getAttribute("prodNuevos");
				Producto producto=(Producto)sesion.getAttribute("productoNuevo");//obtengo el producto nuevo
				array.add(producto);//lo agrego en el array temporal
				prodNuevos1.add(producto);
				sesion.setAttribute("prodNuevos", prodNuevos1);
				sesion.setAttribute("listaProductosCompra", array);//guardo nuevamente la lista temporal en sesion
				sesion.setAttribute("productoNuevo1", null);
				response.sendRedirect("agregarProductosCompra.jsp");
				break;
			case "Modificar":
				response.sendRedirect("altaProductoNuevo.jsp");
				break;
			}
			}else{
				response.sendRedirect("index.jsp");
			}
		}else{
			response.sendRedirect("login.jsp");
		}
	}

}
